package com.itany.corejava.code10_io.字节流;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;

/**
 * @author MissChen
 * @date 2024年03月08日 15:33
 */
public class Test01_FileInputStream {
    public static void main(String[] args) {
        // test01();
        test02();
    }

    public static void test01() {
        FileInputStream in = null;
        try {
            in = new FileInputStream("a.txt");
            // read():从输入流中读取一个数据字节
            // 返回int类型的字节值，如果到末尾，则返回-1
            // int data = in.read();//84 T
            // 中文会出现乱码，中文根据编码不同占据2-3字节，但是读取的是一个字节
            // data = in.read();

            // 由于每次只读一个字节，一个一个读取过于麻烦
            // 通过循环的方式来读取
            int data = -1;
            while ((data = in.read()) != -1) {
                System.out.println((char) data);
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭输入流，释放资源
            // 打开了外部资源，需要关闭
            // 如:文件、数据连接、网络连接等，遵循谁开谁关原则
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void test02() {
        // 在JDK7引入一个新的语法，叫做try-with-resource
        //用于自动关闭外部资源，不需要写finally，可以简化关闭的操作

        try (
                FileInputStream in = new FileInputStream("a.txt");
        ) {
            // int data=in.read();
            // System.out.println(data);
            // System.out.println((char)data);

            // 每次读取一个字节，效率太低，并且容易出问题
            // 因此可以每次设置读取多个字节，减少读取次数，提高效率
            // byte[] b=new byte[3];
            //返回读取的字节的总数
            // int data=in.read(b);
            // System.out.println(data);
            // System.out.println(Arrays.toString(b));
            // System.out.println(new String(b));

            //读取的时候可以将字节数组长度变大一点，防止出现中文乱码
            byte[] b2=new byte[3];
            int data2=-1;
            while((data2=in.read(b2))!=-1){
                // System.out.println(new String(b2));

                //将指定的字节数组从指定索引开始转换，一直转换到指定的长度
                // String(byte[] bytes, int offset, int length)

                System.out.println(Arrays.toString(b2));
                // 第一个参数:需要转换的字节数组
                // 第二个参数:从哪一个索引开始转换
                // 第三个参数:转换多少个字节
                // [84, 104, 105]  [115, 105, 115]

                System.out.println(new String(b2,0,data2));
                System.out.println("-----");
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


}
